package be.vdab.entities;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Collections;
import java.util.Set;

import javax.persistence.CollectionTable;
import javax.persistence.DiscriminatorColumn;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.ManyToOne;
import javax.persistence.OrderBy;
import javax.persistence.Table;
import javax.persistence.JoinColumn;

import be.vdab.valueobjects.Korting;

@Entity
@Table(name="artikels")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="soort")
public abstract class Artikel implements Serializable {
	private static final long serialVersionUID = 1L;
	@Id
	@GeneratedValue
	private long artikelNr;
	private String naam;
	private BigDecimal aankoopprijs;
	private BigDecimal verkoopprijs;
	@ElementCollection
	@CollectionTable(name = "kortingen", 
	  joinColumns = @JoinColumn(name = "artikelNr"))
	@OrderBy("vanafAantal")
	private Set<Korting> kortingen;
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name="ArtikelgroepenNr")
	private Artikelgroep artikelgroep; 
	public Set<Korting> getKortingen() {
	  return Collections.unmodifiableSet(kortingen);
	} 
	protected Artikel(){
	}
	public Artikel(String naam, BigDecimal aankoopprijs, BigDecimal verkoopprijs, Artikelgroep artikelgroep){
		setNaam(naam);
		setVerkoopprijs(verkoopprijs);
		setAankoopprijs(aankoopprijs);
		setArtikelgroep(artikelgroep);
	}
	public String getNaam() {
		return naam;
	}
	public void setNaam(String naam) {
		this.naam = naam;
	}
	public BigDecimal getAankoopprijs() {
		return aankoopprijs;
	}
	public void setAankoopprijs(BigDecimal aankoopprijs) {
		this.aankoopprijs = aankoopprijs;
	}
	public BigDecimal getVerkoopprijs() {
		return verkoopprijs;
	}
	public void setVerkoopprijs(BigDecimal verkoopprijs) {
		this.verkoopprijs = verkoopprijs;
	}
	public long getArtikelNr() {
		return artikelNr;
	}
	public String toString(){
		return String.format("%1$s %2$d %3$d", naam, aankoopprijs, verkoopprijs);
	}
	public void setArtikelgroep(Artikelgroep artikelgroep){
		if(this.artikelgroep != null && this.artikelgroep.getArtikels().contains(this)){
			this.artikelgroep.removeArtikel(this);
		}
		this.artikelgroep = artikelgroep;
		if(artikelgroep != null && ! artikelgroep.getArtikels().contains(this)){
			artikelgroep.addArtikel(this);
		}
	}
	public Artikelgroep getArtikelgroep(){
		return artikelgroep;
	}
}
